﻿#ifndef OVERALLSITUATION_H
#define OVERALLSITUATION_H
#include <QObject>
#include <QDebug>
#include <QThread>
#include <QList>
#include <QMutex>
#include <QFile>
#include <QByteArray>

//#include <iostream>
//#include <fstream>
//#include <vector>
//#include <string>

#include <QJsonDocument>
#include <QJsonObject>
#include <QTcpSocket>
#include <QKeyEvent>
#include <QtNetwork>
#include <QTcpServer>

#include "fileoperation.h"
#include "linuxsystemmethod.h"


#include <openssl/des.h>
#include <sstream>
class OverAllSituation
{
public:
    OverAllSituation();
};

//using namespace std;

//TCP父协议号
#define ACQUISITION_STATION  0                    //采集站
//TCP子协议号
//客户端请求
#define HEARTBEAT_C  0                    //心跳
#define UPLOAD_C  1                    //上传
#define FIRST_UPLOAD_C  2                    //优先上传
#define GET_LOGIN_CONFIG_C  3                    //获取登录配置
#define BACKGROUND_LOGIN_C  4                    //后台登录
#define UPLOAD_LOGIN_C  5                    //上传登录
#define INTERFACE_MAPPING_C  6                    //接口映射
#define INTERFACE_MAPPING_INFO_C  7                    //接口映射消息
#define INTERFACE_MAPPING_EXIT_C  8                    //接口映射退出
#define INTERFACE_MAPPING_SAVE_C  9                    //接口映射保存
#define INTERFACE_SELECTED_PORT_C  10                    //选中串口
#define INTERFACE_BACKGROUND_LOGIN_C  12                    //后台登录
#define INTERFACE_QUERY_C  13                    //数据查询
#define POLICE_MODE_C  14                    //警情模式
#define POLICE_SITUATION_INQUIRY_C  15                    //警情查询
#define POLICE_SITUATION_UPLOAD_C  16                  //警情上传
#define POLICE_SITUATION_SKIP_C  17                  //接口映射跳过
#define CANCEL_UPLOAD 18 //取消导入
#define LOCK_LABEL_C 19 //锁定图标
#define INTERFACE_SWITCH_C 20 //接口切换
//服务端回复
#define HEARTBEAT_S  0                    //心跳
#define UPLOAD_S  1                    //上传
#define FIRST_UPLOAD_S  2                    //优先上传
#define GET_LOGIN_CONFIG_S  3                    //获取登录配置
#define BACKGROUND_LOGIN_S  4                    //后台登录
#define UPLOAD_LOGIN_S  5                    //上传登录
#define INTERFACE_MAPPING_S  6                    //接口映射
#define INTERFACE_MAPPING_INFO_S  7                    //接口映射消息回复
#define INTERFACE_MAPPING_EXIT_S  8                    //接口映射退出
#define INTERFACE_MAPPING_SAVE_S  9                    //接口映射保存
#define MESSAGE_SYNCHRONIZATION     10   // 消息同步
#define INTERFACE_BACKGROUND_LOGIN_S  12                    //后台登录
#define INTERFACE_QUERY_S  13                    //数据查询
#define UPDATE_CONTROL_S  100                    //修改控件
#define DEPARTMENT_FILE_QUERY_S  15                    //部门文件查询
#define POLICE_SITUATION_INQUIRY_S  16                    //警情查询
#define POLICE_SITUATION_UPLOAD_S 17                  //警情上传
#define LOCK_LABEL_S 19 //锁定图标
#define INTERFACE_SWITCH_S 20 //接口切换
//Ui标签控件ID
#define NOTICE_UI  -5                    //公告
#define CPU_UI  -1                    //CPU
#define MEMORY_UI  -2                    //内存
#define DISK_UI  -3                    //磁盘
#define NETWORK_UI       -4    // 网速
#define IP_UI -6 //IP
#define BACKCONNECTION -7 //后台连接状态
//回复消息状态标识
#define SUCCESS  0                    //成功
#define FAIL  1                    //失败
#define EXIT  2                    //退出
#define SAVE  3                    //保存
#define SUCCESS_ADMIN 4

//线程&其他标识号
#define VIDEO  0                    //视频
#define PHOTO  1                    //照片
#define AUDIO  2                    //音频
#define LOG  3                    //日记
#define THREADC6       1    // TCLC6
#define THREADC7       2    // TM_C7
#define THREADS8       3    // TM_S8
#define SYSTEMLIST      5
#define SYSTEMROW       5
#define MAXTHREAD     10    // 最大线程数
#define SYSTEMSUM     26    // 数组总大小
#define UNPLUG         96    // 拔出监听
#define DISKSR         97    // u盘监听
#define MONITOR        98    // 监听
#define TLOGON    99    // 登录
#define TUPLOAD   100   // 上传
#define TUPLOADTWO 101  // 优先上传
#define TNOTICE     102   // 通知
#define SYSTEMINFO     103   // 系统信息
#define INTERFACEMAPPING     104   // 接口映射

//Ui状态
#define STATELESS  -1                    //无状态
#define UPLOADING  0                    //正在上传
#define INITIALIZING  1                    //正在初始化
#define INITIALIZED  2                    //已初始化
#define TURNINGTHEDIAL  3                    //正在转盘
#define TURNTABLESUCCESSFUL  4                    //转盘成功
#define TURNTABLEFAILED  5                    //转盘失败
#define DISKMODE  6                    //磁盘模式
#define IDLE  7                    //空闲
#define UPLOADCOMPLETED  8         //上传完成
#define UPLOADFAILED  9         //上传失败
#define UNBOUND  10         //未绑定警员编号，请手动绑定
#define SCHEDULE  11                    //上传进度
#define WARNBOUND  12         //已绑定警员编号，点击进入警情模式
#define UPLOADSTOP 13
//设备信息
struct DeviceInforMation
{
    int Indet;  //索引
    int serialportnum;//几号串口
    QString vid;//vid
    QString pid;//pid
    QString serialnumber;//设备序列号
    QString manufacturer;//设备制造商 3
    QString model;//设备型号 4
    QString route;//位置路径
    QString Device;//盘符
};


//struct C6Info//线程执行完放回
//{
//    int indentID;
//    int SerialportNum;
//    QString serialnumber;
//    QString Identnumber;
//};
struct UploadInfo//线程执行完放回
{
    int indentID;
    int SerialportNum;
};


struct ThreadInfo//线程插入
{
    int Indet;  //索引
    int ParentID;//父协议
    int SubID;//子协议
    QJsonObject Data;//数据值
};
struct InterfaceMappingInfo//接口映射信息
{
    int Indet;  //索引
    int Row;
    int Column;
};
struct LoginInfo//登录信息
{
    int Indet;  //索引
    QString UserID;//UserID
    QString Password;//Password
    QString Identnumber;//标识号
};
struct DepartmentInfo//部门信息
{
    QString ID;  //部门编号
    QString  Name;//名称

};
struct Announcement
{
QString AnnouncementTitle;//公告标题
QString AnnouncementContent;//公告内容
QString AnnouncementTime;//公告时间
QString AnnouncementCc;//公告发送人
};
struct WarnInfo//警情信息
{
    QString case_number;//警情号
    QString unit_number;//部门号
    QString case_desc;//警情内容
    QString happen_address;//警情地点
    QString call_police_time;//出警时间
    QString alarm_time_text;//处警时间
            QString trafficCaseTable;//警情表
};
struct FileInfo
{
            double fileSize;
    QString fileName;//文件名字
    QString lastModified;// 修改时间
    QString sourceFilePath;//路径
    QString officerID;//警员编号
    QString productNumber;//序列号
};
struct BindingInfo//绑定信息
{
    int winfoid;
    int fileid;
    WarnInfo winfo;//警情信息
//    QString case_number;//警情号
//    QString unit_number;//部门号
//    QString case_desc;//警情内容
//    QString happen_address;//警情地点
//    QString call_police_time;//出警时间
//    QString alarm_time_text;//处警时间
   QString file_type_id;//文件类型id
    QString file_type;//文件类型
            double fileSize;
    QString fileName;//文件名字
    QString lastModified;// 修改时间
    QString sourceFilePath;//路径
    QString officerID;//警员编号
    QString productNumber;//序列号
};
struct UsbInfo
{
    QString Bus ;
    QString vid;//vid
    QString pid;//pid
QString deviceName;
};
extern FileOperation config;
extern DeviceInforMation deviceinfo;

//extern Qt::HANDLE C7Thread;//c7线程编号
//extern Qt::HANDLE C6Thread[10];//c6线程编号
////extern Qt::HANDLE S8Thread[10];//c7线程编号
//extern Qt::HANDLE UploadThread;//上传线程编号
//extern Qt::HANDLE UploadTwoThread;//上传2线程编号
//extern Qt::HANDLE HeartbeatThread[3];//心跳线程编号

extern int Playposition;
extern QTcpSocket *ClientSocket;
extern QString ServerAddress;
extern QString ServerPor;
extern quint16 Prot;
extern LinuxSystemMethod sys;
//extern int threadDisksNum;
//extern int threadMonitorNum;
//extern bool IsC7Task;//任务是否完成；
//extern bool IsC6Task[10];//任务是否完成；
////extern bool IsS8Task[10];//任务是否完成；
//extern bool IsUploadTask;//任务是否完成；
//extern bool IsUploadTwoTask;//任务是否完成；
//extern bool IsHeartbeatTask[10];//任务是否完成；
//extern int   BackError;
//extern int C6Num;//c6线程数
//extern int HeartbeatNum;//心跳线程数
//extern int Heartbeat;//线程返回
//extern int Heartbeat2;//线程返回
//extern int IsUploadSuccess;//是否成功；
//extern int IsUploadTwoSuccess;//任务是否完成；
//extern int IsHeartbeatSuccess;//任务是否完成；

//extern QString URL;
//extern QString Sockettime;
extern QString currentPath;
//extern QString PortNum;
//extern QString DeleteFiles;
//extern QString TheLocalKey;
//extern QString TheLocalKeyPDW;
//extern QString Ttime;
//extern QString BackgroundVersion;
//extern QString UploadUrl;
//extern QString MountUrl;
//extern QString Mode;
//extern QString MemoryLack;
//extern QString CPULack;
//extern QString Camera;
//extern QString FingerPrint;
//extern QString FaceRecognition;
//extern QString prior;
////extern QString text;
//extern QString MUI;
//extern QString BVersion;//后台版本号
//extern QString System;//系统
extern QString UploadRate;//最大上传速率
//extern QString Name;
//extern QString Version;
//extern QString Model;
//extern QString Date;
//extern QString Icon;
//extern QString DesktopIcon;
//extern QString CPU;
//extern QString MEMORY;
//extern QString DISK;
//extern QString NETWORK;
extern QString mac;
extern QString time_on;
extern QString time_end;
extern QString NetworkName;

extern QString IP;

//extern QString Notice;
//extern QMutex myVecMutex;
//extern QMutex DeviceserialMutex;
//extern QMutex DriveLetterMutex;
extern QString cSerial[SYSTEMSUM];         //执法记录仪产品序号
extern QString userNo[SYSTEMSUM];      //执法记录仪警员编号
extern QString userName[SYSTEMSUM]; //执法记录仪警员名称
extern QString unitNo[SYSTEMSUM];       //执法记录仪单位编号
extern QString unitName[SYSTEMSUM];  //执法记录仪单位名称
extern QString status[SYSTEMSUM];   //执法仪禁用状态
extern QString bindStatus[SYSTEMSUM];//执法仪配对状态；
extern QString watermark[SYSTEMSUM];//水印；
extern QString resolution[SYSTEMSUM];//分辨率；


extern qint64 IsDriverTime[SYSTEMSUM];//等待磁盘时间
//迁移
extern bool IsClosingLogin;//是否关闭登录窗体
extern bool IsWarnInstance;//是否是警情模式
extern bool IsAppointFirst;//是否指定优先
extern bool IsDeleteFiles;//上传是否删除文件
extern bool IsCallPolice;
extern bool Isbinding[SYSTEMSUM];//是否绑定 true为已经重置成功，false反正
extern bool IsPriorlize[SYSTEMSUM];//是否为优先口 true为优先口，false反正
extern bool IsInitalize[SYSTEMSUM];//是否进入初始化 true为已经初始化成功，false反正
extern bool IsALLlist[SYSTEMSUM];//是否重置路径 true为已经重置成功，false反正
extern bool IsExtract[SYSTEMSUM];//是否拔出 true为已经重置成功，false反正
extern bool IsUpload[SYSTEMSUM];//是否上传 true为已经重置成功，false反正
extern int NewSerialportNum;//现在选择的是几号重置口
extern int AppointFirstNum;//现在选择的是几号优先串口
extern int AppointFirst;//暂时优先串口
extern int CPUAbnormalNum;
extern int StayScreen;//停留界面
extern int row;//行
extern int column;//列
extern int SerialPort;//选中上传端口
extern int Newrow;//行
extern int Newcolumn;//列
extern int NewUserStatus;//当前登录用户身份 0普通用户 1管理用户
extern int  IsBackdll[SYSTEMSUM];//dll调用是否成功 0进入转盘 1转盘成功 -1转盘失败 2磁盘模式 3正在传盘
extern double FreeGB;
extern QString authorize_code;//当前授权码
extern QString NewUserID;//当前登录用户ID
extern QString TemporaryPath[SYSTEMSUM];//临时路径
extern QString CallPoliceInfo;
extern qint64 IdentElectricity[SYSTEMSUM];
extern QString IdentModel[SYSTEMSUM];//记录设备型号
extern QString IdentNumber[SYSTEMSUM];//记录设备标识号
extern QString IsUdisk[SYSTEMSUM];//转盘是否成功 有值则有，没有则无

//extern QList<QString> usbInfoList; // 在类的私有成员中声明m_usbInfoList

//extern std::vector<DeviceInforMation> myVec;//接入的设备信息
//extern std::vector<QString> Deviceserialnumber;//进程开启时用来保存所有磁盘序列号
//extern std::list<QString> DriveLetterPath;//保存最新获取的磁盘序列号

extern std::vector<Announcement> Notice;
extern std::vector<QString> newDrives;//盘符号
//inline void DeviceInfo();
extern std::vector<DepartmentInfo>Filetype ;//文件类型
extern std::vector<DepartmentInfo>DepartmentName ;//部门名称
extern std::vector<WarnInfo>PoliceInfo ;//警情名称
extern std::list<BindingInfo>BindList;//绑定信息
extern std::vector<UsbInfo> usbInfo;//接入的设备信息
//int GetMyVec(QString Route,QString Serialnumber);
//int Driveletterdrive(bool ident);

bool GetDeviceName(QString vid ,QString pid);
bool encryptFile(const QString& filePath, const QString& password);
bool decryptFile(const QString& filePath, const QString& password);
void getUsbInfo();


void GetSerialNumber(int serialportnum,QString Device,QString serialnumber);
//void Montior(MSG *message);

void InterfaceMapInfo();

void CheckDriveChanges();
std::string des_cbc_pkcs5_encrypt(const std::string &clearText);
std::string des_cbc_pkcs5_decrypt(const std::string &cipherText);
// 加密后密文转hex
std::string StringToHex(const std::string& data);


class GlobalSignals : public QObject
{
    Q_OBJECT

signals:
//    void Print(const QString& text);
//    void functionResult(int indentID,int SerialportNum,QString serialnumber,QString Identnumber);
//    void SetNotice(int indentID, QString title);
//    void UploadFile(int indentID,int SerialportNum);
//    void UploadFile_Two(int indentID,int SerialportNum);
//    void ChangeNotification();
     bool SetLabel(int Index,QString Text,QString TextInfo,QString Textprompt,int Display);
//    void ThreadJoin(int serialportnum,QString vid ,QString pid,QString serialnumber);
//    //void on_comboBox_num_activated(int index);
//     void ResetTing();
//     void threadDisksNum();
//     void threadMonitorNum();


public:
    static GlobalSignals& instance()
    {
        static GlobalSignals s;
        return s;
    }



private:
    GlobalSignals();
    GlobalSignals(const GlobalSignals&) = delete;
    GlobalSignals& operator=(const GlobalSignals&) = delete;

};
#endif // OVERALLSITUATION_H
